/**
 * students.js
 * 数据操作文件模块
 * 职责：操作文件中的数据，只处理数据不关心业务
 */
const fs = require('fs')

const dbPath = './db.json'

// 获取所有学生列表

// 1 使用回调函数解决异步回调问题
// callback 中的参数
// err: 错误信息 成功是 null  错误是错误对象
// data: 学生对象 成功是 students 错误是 undefined
// 调用： find((err, data) => {  })
// exports.find = (callback) => {
//     fs.readFile(dbPath, 'utf8', (err, data) => {
//         if (err) {
//             callback(err)
//         }

//         callback(null, JSON.parse(data).students)
//     })
// }

// 2 使用 es6 Promise 解决异步回调问题
// 调用 find().then(students => {  }).catch(err => {  })
exports.find = () => {
    // 读取文件中的数据
    // readFile 的第二个参数是可选的，传入 utf8 就是告诉把读取到的文件按照 utf8 编码转成我们能认识的字符
    // 除了这样转换，还可以使用 data.toString() 的方式转换
    return new Promise((resolve, reject) => {
        fs.readFile(dbPath, 'utf8', (err, data) => {
            if (err) {
                reject(err)
            }

            console.log(data)

            // 把字符串转换成对象
            const students = JSON.parse(data).students

            resolve(students)
        })
    })
}

exports.findById = (id) => {
    // 读取文件中的数据
    // readFile 的第二个参数是可选的，传入 utf8 就是告诉把读取到的文件按照 utf8 编码转成我们能认识的字符
    // 除了这样转换，还可以使用 data.toString() 的方式转换
    return new Promise((resolve, reject) => {
        fs.readFile(dbPath, 'utf8', (err, data) => {
            if (err) {
                reject(err)
            }

            console.log(data)

            // 把字符串转换成对象
            const students = JSON.parse(data).students
            const student = students.find((element) => Number(id) === element.id)
            resolve(student)
        })
    })
}

// 添加学生
exports.save = (student) => {
    return new Promise((resolve, reject) => {
        fs.readFile(dbPath, 'utf8', (err, data) => {
            if (err) {
                reject(err)
            }

            console.log(data)

            // 把字符串转换成对象
            const students = JSON.parse(data).students

            let id = students.length > 0 ? students[students.length - 1].id + 1 : 1

            student.id = id

            students.push(student)

            // 把文件写到 db.json 中
            fs.writeFile(dbPath, JSON.stringify({ students }), err => {
                if (err) {
                    reject(err)
                }
                resolve()
            })
        })
    })
}

// 更新学生
exports.updateById = (student) => {
    console.log(student)
    return new Promise((resolve, reject) => {
        fs.readFile(dbPath, 'utf8', (err, data) => {
            if (err) {
                reject(err)
            }
            console.log(data)

            // 把字符串转换成对象
            const students = JSON.parse(data).students

            // 查询需要更新的学生
            const temp = students.find((element) => Number(student.id) === element.id)

            console.log('find student ---> ', temp)

            // 修改 temp 属性的值
            temp.name = student.name
            temp.age = student.age
            temp.hobbies = student.hobbies

            // 把文件写到 db.json 中
            fs.writeFile(dbPath, JSON.stringify({ students }), err => {
                if (err) {
                    reject(err)
                }
                resolve()
            })
        })
    })
}

// 删除学生
exports.deleteById = (id) => {
    return new Promise((resolve, reject) => {
        fs.readFile(dbPath, 'utf8', (err, data) => {
            if (err) {
                reject(err)
            }
            console.log(data)

            // 把字符串转换成对象
            const students = JSON.parse(data).students

            // 查询需要更新的学生的索引
            const index = students.findIndex((element) => Number(id) === element.id)

            console.log('find student index ---> ', index)

            // 删除数据
            students.splice(index, 1)

            console.log('deleted --- >', students)

            // 把文件写到 db.json 中
            fs.writeFile(dbPath, JSON.stringify({ students }), err => {
                if (err) {
                    reject(err)
                }
                resolve()
            })
        })
    })
}